﻿/*
 				________________________________COPYRIGHT_______________________________________
				Die Veröffentlichung dieses Objektes ist Illegal und wird strafrechtlich verfolgt
				werden. Sollte es zu einer Veröffentlichung kommen werden wir die Daten des
				Herrausgebers fündig machen und Anzeige erstatten. Desweiteren ist
				auch jeglicher Besitz dieses Objektes Illegal und kann ebenfalls als Grund für
				eine Anzeige verwendet werden.
				Ausnahmen der veröffentlichung und verleihung gelten nur wenn der Grundbesitzer
				diese durchführt.
				Die Uhrheberrechte dieses Objektes liegen der Entwickler Gruppe CyberScripting vor. 
                © 2011.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace cubeworld
{
    class WorldGenerator
    {

        Texture2D tex;
        Color[,] color;

        public WorldGenerator(int height, int width, List<Block> blocks, float sensitivity = 2.5f)
        {
            tex = Texture2D.FromStream(MainGame.Device, new FileStream(".\\Content\\maps\\perlin.png", FileMode.Open));
            color = TextureTo2DArray(tex);

            Random rand = new Random();

            for (int x = 0; x < tex.Width; x++)
            {
                for (int z = 0; z < tex.Height; z++)
                {
                    Byte hell = color[x, z].R;
                    float heightY = roundTo1(hell / sensitivity);
                    blocks.Add(new Blocks.MarsRock(new Vector3(x, heightY, z)));
                    //Data.test = color[x, z].R;
                    //roundTo5(color[x, z].R / 5.0f);
                    
                    for (float y = 0.0f; y < heightY; y = y + 1.0f)
                    { 
                        
                        int blockRand = rand.Next(100);
                        if (blockRand > 94)
                        {
                            blocks.Add(new Blocks.Stone(new Vector3(x, y, z)));
                        }
                        else if (blockRand < 96 && blockRand > 79)
                        {
                            blocks.Add(new Blocks.BrimStone(new Vector3(x, y, z)));
                        }
                        else
                        {
                            blocks.Add(new Blocks.MarsRock(new Vector3(x, y, z)));
                        }
                    }
                }
            }
        }

        public float roundTo1(float a)
        {
            float r = (a-(5*((a/5)-(int)(a/5))))/5;
            //Data.test = r;
            return r;
        }

        private Color[,] TextureTo2DArray(Texture2D texture)
        {
            Color[] colors1D = new Color[texture.Width * texture.Height];
            texture.GetData(colors1D);
            Color[,] colors2D = new Color[texture.Width, texture.Height];
            for (int x = 0; x < texture.Width; x++)
                for (int y = 0; y < texture.Height; y++)
                    colors2D[x, y] = colors1D[x + y * texture.Width];

            return colors2D;
        }
    }
}
